import os.path
from django.core.paginator import Paginator
from django.db.models import F
from django.http import HttpResponse, JsonResponse
from django.shortcuts import render, redirect
from django.urls import reverse
from comment.models import Comment,Like
from .models import Type,Note
from mynote.settings import STATICFILES_DIRS
from os import path
# note 下的 views
def index_view(request):
    # 返回给前台页面一个所有分类，用来来渲染导航条身上的所有分类 --query_set
    all_types = Type.objects.all()
    # 返回前台 笔记的阅读最多的三条
    readed_notes = Note.objects.filter(is_delete=False).order_by('-read_num')[:3]
    # 返回前台 笔记的点赞最多的三条
    like_notes = Note.objects.filter(is_delete=False).order_by('-like_num')[:3]
    # 图片随机列表  获取到文件夹的位置，再有我们是要获取到该文件夹中所有文件的名字
    img_path = path.join(STATICFILES_DIRS[0], 'img', 'books')
    all_pic_name = os.listdir(img_path)
    imgs = [f'/static/img/books/{i} ' for i in all_pic_name]
    return render(request,'note/index.html',locals())


def note_list_view(request):
    if request.method == 'GET':
        # 获取链接地址传来的查询字符串
        tag = request.GET.get('tag')
        kw = request.GET.get('kw')
        # 返回给前台页面一个所有分类，用来来渲染导航条身上的所有分类 --query_set
        all_types = Type.objects.all()
        # 大屏幕显示的内容
        banner={}
        # 热门文章
        hot_note = Note.objects.filter(is_delete=False).order_by('-read_num')
        # 图片随机列表  获取到文件夹的位置，再有我们是要获取到该文件夹中所有文件的名字
        img_path = path.join(STATICFILES_DIRS[0],'img','books')
        all_pic_name = os.listdir(img_path)
        imgs = [f'/static/img/books/{i} 'for i in all_pic_name ]
        notes= {}
        if kw:
            is_exits = Note.objects.filter(is_delete=False, title__icontains=kw).exists()
            banner['title'] = '搜索展示'
            banner['dec'] = '这关于' + kw + '搜索内容'
            notes = Note.objects.filter(is_delete=False, title__icontains=kw).order_by('-pub_date')
        elif tag == 'all':
            # 返回所有的笔记
            is_exits = Note.objects.filter(is_delete=False).exists()
            notes = Note.objects.filter(is_delete=False).order_by('-pub_date')
            # 设置大屏内容
            banner['title'] = '欢迎来到云笔记'
            banner['dec'] = '在这里记录你的每一点进步。。。'
        else:
            # 返回其他类型下对应的笔记 tag = Type类型中的其中一个类型
            is_exits = Type.objects.filter(name=tag).exists()
            if is_exits:
                type = Type.objects.get(name=tag)  # Type 创建出来的对象
                # 设置大屏内容
                banner['title'] = '欢迎来到'+ tag +'板块'
                banner['dec'] = type.type_dec
                notes = Note.objects.filter(is_delete=False,type = type).order_by('-pub_date')
        # 分页功能
        # 1、实例一个分页对象
        paginator = Paginator(notes,2)
        # 2、生成一个当前页的对象
        pid = request.GET.get('pid',1)
        c_page = paginator.page(pid)
        return render(request,'note/note_list.html',locals())


    elif request.method == 'POST':
        #1、获取数据
        kw = request.POST.get('kw')
        tag = request.POST.get('tag')
        pid = request.POST.get('pid')
        #2、 通过关键字，然后再告诉页面需要展示什么内容
        if kw:
            # 需要页面展示搜索的内容
            url = f'/note/note_list?kw={kw}'
            return redirect(url)
        else:
            # 没有搜索关键字，就是正常的展示页面数据，重定向到原来的地址
            if tag and pid:
                # 判断是否有
                url = f'/note/note_list?tag={tag}&pid={pid}'
                return redirect(url)
            elif  pid:
                url = f'/note/note_list?pid={pid}'
                return redirect(url)


def note_detail_view(request,nid):
    if request.method == 'GET':
        # 只要请求了这个地址，就让这篇笔记的浏览量+1
        Note.objects.filter(id = nid).update(read_num = F('read_num')+1)
        # 通过参数笔记id 去数据库中查询响应的这篇笔记，渲染到页面
        try:
            note = Note.objects.get(id = nid)
        except Exception as e:
            return HttpResponse('没找到你要的文章')
        # 获取作者的其他所有文章
        all_notes = Note.objects.filter(user = note.user,is_delete=False).order_by('-read_num')
        # 获取所有的评论
        all_comments = Comment.objects.filter(note_id=nid,is_delete = False)
        comments = [] #(评论，对应的回复)，(评论，对应的回复)，(评论，对应的回复)，
        # 遍历这些评论 parent = none
        for com in all_comments:
            if com.parent_id == None:
                # com 就是一个评论 ，再查出来他的所有回复
                replys = com.comment_set.all()
                # 这条评论下面是否有回复 ，筛选出对应的回复，
                if replys:
                # 重新封装一个二维的列表,把评论和回复分开放入列表中
                    comments.append((com,replys))
                else:
                    comments.append((com,[]))

        return render(request,'note/note_detail.html',locals())
    elif request.method == 'POST':
        body = request.POST.get('body','').strip()
        # cid 是评论的id
        cid = request.POST.get('cid')
        # 回复的内容
        reply_body = request.POST.get('reply_body','').strip()
        user = request.user
        url = reverse('note_detail', args=[nid])
        if not body and not reply_body: # 如果评论和回复都为空
            return HttpResponse(f'<script>alert("评论内容不能为空");location.href="{url}"</script>')
        # 存储评论
        if body:
            # 添加的是评论
            Comment.objects.create(note_id=nid,user=user,body=body,parent=None)
        elif reply_body:
            # 这里添加的就是针对某个评论的回复了
            Comment.objects.create(note_id=nid, user=user, body=reply_body, parent_id=cid)
        print(body)
        return HttpResponse(f'<script>alert("评论成功！");location.href="{url}"</script>')


def update_like_view(request):
    # 1、接收前端传来的数据
    nid = request.GET.get('note_id')
    flag = request.GET.get('flag')
    user =  request.user
    data={} # 给前台返回的数据列表
    # 2、 通过flag值判断是否想点赞 ，如果flag为false 是想要点赞
    if not flag:
        # flag为false 是想要点赞
        # 判断这个用户对这个文章是否点过赞 objects .get_or_create(id = nid)
        like,created = Like.objects.get_or_create(note_id=nid,user=user,state=True)
        if created:
            # 原来的表中没有，说明可以点赞
            # 通过nid 查询到对应的笔记文章，把该文章的点赞数+1，并且保存
            # note = Note.objects.get(id = nid)
            # note.like_num += 1
            # note.save()
            Note.objects.filter(id = nid).update(like_num = F('like_num')+1)
            # 将结果响应给前台
            like_num = Note.objects.get(id = nid).like_num
            data['like_num'] = like_num
            data['message'] = '增加了点赞'
            return  JsonResponse(data)
        else:
            # 表中有了这条记录了，说明这个用户针对这篇文章，已经点过赞了
            like_num = Note.objects.get(id=nid).like_num
            data['like_num'] = like_num
            data['message'] = '不要重复点赞'
            return JsonResponse(data)
    else:
      # flag为 true 是想要取消点赞
        is_exists = Like.objects.filter(note_id=nid,user=user,state=True).exists()

        if is_exists:
            # 判断 Like表中该用户 针对这篇文章 是否有点赞的记录 ，如果有就可以取消点赞
            #1、将对应的笔记的点赞数减一
            Note.objects.filter(id=nid).update(like_num=F('like_num') - 1)
            # 2、 删除 Like表中对应的数据
            Like.objects.filter(note_id=nid,user=user,state=True).delete()
            # 3 、 将结果响应给前台
            like_num = Note.objects.get(id=nid).like_num
            data['like_num'] = like_num
            data['message'] = '取消了点赞'
            return JsonResponse(data)
        else:
         # 判断 Like表中该用户 针对这篇文章 是否有点赞的记录 ，如果没有就不能取消点赞或则是已经取消了不能再取消了
             # 3 、 将结果响应给前台
             like_num = Note.objects.get(id=nid).like_num
             data['like_num'] = like_num
             data['message'] = '不能重复取消点赞'
             return JsonResponse(data)